package main

import "fmt"

type Data struct {
}

func (Data) TestValue() {
	fmt.Println("Data")
}

func (*Data) TestPointer() {
	fmt.Println("*Data")
}

func main() {
	//显示调用

	//这种字面量显示调用，无论值调用，还是表达式调用
	//编译器都不会进行方法集的自动转换，编译器会严格校验方案

	//*Data 的方法集是 TestPointer 和 TestValue
	//Data 的方法集只有 TestValue

	//方式一
	(*Data)(&struct{}{}).TestPointer() //显示地调用
	(*Data)(&struct{}{}).TestValue()   //显式地调用

	(Data)(struct{}{}).TestValue() //方法值

	//方式二
	Data.TestValue(Data{}) //方法表达式

	//方式三
	Data.TestValue(struct{}{}) //方法表达式

}
